#include <stdio.h>
#include <pthread.h>
#include <signal.h>
void* func1(void*);
void* func2(void*);
void alarm_handle(int);
int main(void)
{
	pthread_t t1_id,t2_id;
	pthread_create(&t1_id,NULL,func1,(void*)NULL);
	pthread_create(&t2_id,NULL,func2,(void*)&t1_id);
	// 虽然是睡眠10s，但是子线程会发送alarm信号(SIGALRM默认给主线程处理)，这时主线程会醒来继续运行，可以在主线程中屏蔽，如下
	// 编译时加上 std=gnu99，不然会显示sigset_t类型没有定义
	sigset_t sig_set;
	sigemptyset(&sig_set);
	sigaddset(&sig_set,SIGALRM);
	// 屏蔽，当前线程不会处理
	pthread_sigmask(SIG_SETMASK,&sig_set,NULL);
	for(int i = 0;i < 10;i++)
	{
		printf("master thread i = %d;thread_id = %d\n",i,pthread_self());
		sleep(10);
	}
	pthread_join(t1_id,NULL);
	pthread_join(t2_id,NULL);
	return 0;
}
void alarm_handle(int sig)
{
	printf("I am alarm handle;threadid = %d\n",pthread_self());
	signal(SIGALRM,alarm_handle);
	alarm(2);
}
void* func1(void* data)
{
	// 在子线程中设置信号处理函数
	signal(SIGALRM,alarm_handle);
	alarm(2);
	for(int i = 0;i < 100;i++)
	{
		printf("thread1 i = %d;thread_id = %d\n",i,pthread_self());
		sleep(1);
	}
	return (void*)NULL;
}
void* func2(void* data)
{
	for(int i = 0;i < 100;i++)
	{
		if(i == 8)
		{
			// 终止func1进程
			pthread_cancel(*((pthread_t*)data));
		}
		printf("thread2 i = %d;thread_id = %d\n",i,pthread_self());
		sleep(1);
	}
	return (void*)NULL;
}
